package com.water.note.config;

import cn.dev33.satoken.context.SaHolder;
import cn.dev33.satoken.interceptor.SaInterceptor;
import cn.dev33.satoken.router.SaHttpMethod;
import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.stp.StpUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;

/**
 * Sa-Token 配置
 */
@Configuration
public class SaTokenConfig implements WebMvcConfigurer {

    private static final Logger log = LoggerFactory.getLogger(SaTokenConfig.class);

    /**
     * 注册 Sa-Token 拦截器
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 注册 Sa-Token 拦截器，定义拦截规则
        registry.addInterceptor(new SaInterceptor(handler -> {
            // 获取当前请求路径
            String path = SaHolder.getRequest().getRequestPath();
            String method = SaHolder.getRequest().getMethod();
            log.debug("Sa-Token拦截器 - 接收到请求: {} {}", method, path);
            
            // 尝试获取当前token值
            String tokenValue = StpUtil.getTokenValue();
            log.debug("当前token值: {}", tokenValue);
            
            // 打印请求头 (简化处理，只打印关键头)
            String tokenHeader = SaHolder.getRequest().getHeader(StpUtil.getTokenName());
            log.debug("Token头 [{}]: {}", StpUtil.getTokenName(), tokenHeader);
            
            // 登录校验 - 拦截所有需要登录的路由
            SaRouter.match("/**")
                    // 排除登录接口 - 注意context-path已经是/api
                    .notMatch("/user/login")
                    .notMatch("/user/register")
                    // 添加测试接口，用于调试
                    .notMatch("/test/**")
                    // 排除OPTIONS预检请求
                    .notMatch(SaHttpMethod.OPTIONS)
                    // 排除静态资源
                    .notMatch("/static/**")
                    // 排除接口文档
                    .notMatch("/swagger-ui/**", "/swagger-resources/**", "/v3/api-docs/**", "/doc.html")
                    // 检查是否登录
                    .check(r -> {
                        try {
                            log.debug("Sa-Token拦截器 - 执行登录检查，路径: {}", path);
                            StpUtil.checkLogin();
                            log.debug("登录检查通过");
                        } catch (Exception e) {
                            log.warn("登录检查失败: {}", e.getMessage());
                            throw e;
                        }
                    });

            // 权限认证 - 不同接口访问权限不同
            SaRouter.match("/admin/**", r -> StpUtil.checkRole("admin"));

        })).addPathPatterns("/**").order(0); // 调整优先级，避免过早拦截
    }

}